--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / frontend / js / browserLayoutStore.js
Displaying Raw • Download
meshchatx/src/frontend/js/browserLayoutStore.js 9f71f3420c18d5800afb493b723c328d23c7ea12 (9f71f342) Text, 5.64 KB
Tff7b72const Te6edf3NOMAD_TABS_KEY Tff7b72= Ta5d6ff"meshchatx.nomadnet.tabs"Tb4b4b4;
Tff7b72const Te6edf3MAP_TABS_KEY Tff7b72= Ta5d6ff"meshchatx.map.tabs"Tb4b4b4;
Tff7b72const Te6edf3MESSAGE_PANES_KEY Tff7b72= Ta5d6ff"meshchatx.messages.panes"Tb4b4b4;
Tff7b72const Te6edf3RNSH_LAYOUT_KEY Tff7b72= Ta5d6ff"meshchatx.rnsh.layout"Tb4b4b4;
Tff7b72const Te6edf3RNX_LAYOUT_KEY Tff7b72= Ta5d6ff"meshchatx.rnx.layout"Tb4b4b4;
Tff7b72const Te6edf3FEATURE_SIDEBAR_COLLAPSED_KEYS Tff7b72= Tb4b4b4{
Te6edf3appTff7b72: Ta5d6ff"meshchatx.sidebar.app"Tb4b4b4,
Te6edf3messagesTff7b72: Ta5d6ff"meshchatx.sidebar.messages"Tb4b4b4,
Te6edf3nomadnetworkTff7b72: Ta5d6ff"meshchatx.sidebar.nomadnetwork"Tb4b4b4,
Te6edf3relayChatTff7b72: Ta5d6ff"meshchatx.sidebar.relay-chat"Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3LEGACY_RELAY_SIDEBAR_COLLAPSED_KEY Tff7b72= Ta5d6ff"relayChatSidebarCollapsed"Tb4b4b4;
T8b949e/**
* Safely read and parse a JSON value from localStorage.
*
* @param {string} key storage key
* @returns {*} parsed value, or null when missing or unreadable
*/
Tff7b72function Te6edf3readJsonTb4b4b4(Te6edf3keyTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72typeof Tffa657window Tff7b72=== Ta5d6ff"undefined" Tff7b72|| Tff7b72!Tffa657windowTb4b4b4.Te6edf3localStorageTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3raw Tff7b72= Tffa657windowTb4b4b4.Te6edf3localStorageTb4b4b4.Te6edf3getItemTb4b4b4(Te6edf3keyTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3rawTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Tffa657JSONTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3rawTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* Safely serialise and store a JSON value in localStorage.
*
* @param {string} key storage key
* @param {*} value value to persist
*/
Tff7b72function Te6edf3writeJsonTb4b4b4(Te6edf3keyTb4b4b4, Te6edf3valueTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72typeof Tffa657window Tff7b72=== Ta5d6ff"undefined" Tff7b72|| Tff7b72!Tffa657windowTb4b4b4.Te6edf3localStorageTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tffa657windowTb4b4b4.Te6edf3localStorageTb4b4b4.Te6edf3setItemTb4b4b4(Te6edf3keyTb4b4b4, Tffa657JSONTb4b4b4.Te6edf3stringifyTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// persistence is best-effort; ignore quota or availability errors
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* Load the persisted NomadNet browser tab layout.
*
* @returns {{tabs: Array, activeIndex: number}|null} saved layout or null
*/
Tff7b72export Tff7b72function Te6edf3loadNomadTabsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3data Tff7b72= Te6edf3readJsonTb4b4b4(Te6edf3NOMAD_TABS_KEYTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3data Tff7b72|| Tff7b72!Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3dataTb4b4b4.Te6edf3tabsTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3dataTb4b4b4;
Tb4b4b4}
T8b949e/**
* Persist the NomadNet browser tab layout.
*
* @param {{tabs: Array, activeIndex: number}} state layout to save
*/
Tff7b72export Tff7b72function Te6edf3saveNomadTabsTb4b4b4(Te6edf3stateTb4b4b4) Tb4b4b4{
Te6edf3writeJsonTb4b4b4(Te6edf3NOMAD_TABS_KEYTb4b4b4, Te6edf3stateTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Load the persisted Map browser tab layout.
*
* @returns {{tabs: Array, activeIndex: number}|null} saved layout or null
*/
Tff7b72export Tff7b72function Te6edf3loadMapTabsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3data Tff7b72= Te6edf3readJsonTb4b4b4(Te6edf3MAP_TABS_KEYTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3data Tff7b72|| Tff7b72!Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3dataTb4b4b4.Te6edf3tabsTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3dataTb4b4b4;
Tb4b4b4}
T8b949e/**
* Persist the Map browser tab layout.
*
* @param {{tabs: Array, activeIndex: number}} state layout to save
*/
Tff7b72export Tff7b72function Te6edf3saveMapTabsTb4b4b4(Te6edf3stateTb4b4b4) Tb4b4b4{
Te6edf3writeJsonTb4b4b4(Te6edf3MAP_TABS_KEYTb4b4b4, Te6edf3stateTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Load the persisted Messages pane layout.
*
* @returns {{panes: Array, focusedIndex: number}|null} saved layout or null
*/
Tff7b72export Tff7b72function Te6edf3loadMessagePanesTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3data Tff7b72= Te6edf3readJsonTb4b4b4(Te6edf3MESSAGE_PANES_KEYTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3data Tff7b72|| Tff7b72!Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3dataTb4b4b4.Te6edf3panesTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3dataTb4b4b4;
Tb4b4b4}
T8b949e/**
* Persist the Messages pane layout.
*
* @param {{panes: Array, focusedIndex: number}} state layout to save
*/
Tff7b72export Tff7b72function Te6edf3saveMessagePanesTb4b4b4(Te6edf3stateTb4b4b4) Tb4b4b4{
Te6edf3writeJsonTb4b4b4(Te6edf3MESSAGE_PANES_KEYTb4b4b4, Te6edf3stateTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Load persisted RNSH manager UI layout.
*
* @returns {{selectedSessionId: string|null}|null} saved layout or null
*/
Tff7b72export Tff7b72function Te6edf3loadRnshLayoutTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3data Tff7b72= Te6edf3readJsonTb4b4b4(Te6edf3RNSH_LAYOUT_KEYTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3data Tff7b72|| Tff7b72typeof Te6edf3data Tff7b72!== Ta5d6ff"object"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3dataTb4b4b4;
Tb4b4b4}
T8b949e/**
* Persist RNSH manager UI layout.
*
* @param {{selectedSessionId: string|null}} state layout to save
*/
Tff7b72export Tff7b72function Te6edf3saveRnshLayoutTb4b4b4(Te6edf3stateTb4b4b4) Tb4b4b4{
Te6edf3writeJsonTb4b4b4(Te6edf3RNSH_LAYOUT_KEYTb4b4b4, Te6edf3stateTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Load persisted RNX manager UI layout.
*
* @returns {{selectedSessionId: string|null}|null} saved layout or null
*/
Tff7b72export Tff7b72function Te6edf3loadRnxLayoutTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3data Tff7b72= Te6edf3readJsonTb4b4b4(Te6edf3RNX_LAYOUT_KEYTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3data Tff7b72|| Tff7b72typeof Te6edf3data Tff7b72!== Ta5d6ff"object"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3dataTb4b4b4;
Tb4b4b4}
T8b949e/**
* Persist RNX manager UI layout.
*
* @param {{selectedSessionId: string|null}} state layout to save
*/
Tff7b72export Tff7b72function Te6edf3saveRnxLayoutTb4b4b4(Te6edf3stateTb4b4b4) Tb4b4b4{
Te6edf3writeJsonTb4b4b4(Te6edf3RNX_LAYOUT_KEYTb4b4b4, Te6edf3stateTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Load a persisted feature sidebar collapsed flag.
*
* @param {"app"|"messages"|"nomadnetwork"|"relayChat"} feature sidebar feature id
* @returns {boolean|null} saved value, or null when unset
*/
Tff7b72export Tff7b72function Te6edf3loadFeatureSidebarCollapsedTb4b4b4(Te6edf3featureTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3key Tff7b72= Te6edf3FEATURE_SIDEBAR_COLLAPSED_KEYSTb4b4b4[Te6edf3featureTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3keyTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3saved Tff7b72= Te6edf3readJsonTb4b4b4(Te6edf3keyTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3saved Tff7b72=== Tff7b72true Tff7b72|| Te6edf3saved Tff7b72=== Tff7b72falseTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3savedTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3feature Tff7b72=== Ta5d6ff"relayChat"Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72typeof Tffa657window Tff7b72!== Ta5d6ff"undefined" Tff7b72&& Tffa657windowTb4b4b4.Te6edf3localStorageTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3legacy Tff7b72= Tffa657windowTb4b4b4.Te6edf3localStorageTb4b4b4.Te6edf3getItemTb4b4b4(Te6edf3LEGACY_RELAY_SIDEBAR_COLLAPSED_KEYTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3legacy Tff7b72=== Ta5d6ff"1"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3legacy Tff7b72=== Ta5d6ff"0"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
T8b949e/**
* Persist a feature sidebar collapsed flag.
*
* @param {"app"|"messages"|"nomadnetwork"|"relayChat"} feature sidebar feature id
* @param {boolean} collapsed whether the sidebar is collapsed
*/
Tff7b72export Tff7b72function Te6edf3saveFeatureSidebarCollapsedTb4b4b4(Te6edf3featureTb4b4b4, Te6edf3collapsedTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3key Tff7b72= Te6edf3FEATURE_SIDEBAR_COLLAPSED_KEYSTb4b4b4[Te6edf3featureTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3keyTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3writeJsonTb4b4b4(Te6edf3keyTb4b4b4, Te6edf3collapsed Tff7b72=== Tff7b72trueTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3feature Tff7b72=== Ta5d6ff"relayChat"Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72typeof Tffa657window Tff7b72!== Ta5d6ff"undefined" Tff7b72&& Tffa657windowTb4b4b4.Te6edf3localStorageTb4b4b4) Tb4b4b4{
Tffa657windowTb4b4b4.Te6edf3localStorageTb4b4b4.Te6edf3setItemTb4b4b4(Te6edf3LEGACY_RELAY_SIDEBAR_COLLAPSED_KEYTb4b4b4, Te6edf3collapsed Tff7b72? Ta5d6ff"1" Tff7b72: Ta5d6ff"0"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// persistence is best-effort
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────